package com.jwinf.cdLibary.controller;

import com.jwinf.cdLibary.domain.User;
import com.jwinf.cdLibary.service.UserService;
import com.jwinf.cdLibary.tool.WindowUtils;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;

import java.io.IOException;
import java.net.URL;
import java.util.Iterator;
import java.util.ResourceBundle;

/**
 * @author jwinf
 * 用户管理窗口控制类
 */
public class UserManageFrameController implements Initializable {
    @FXML
    private Label goback;
    @FXML
    private Label usernameicon;
    @FXML
    private TextField usernametxt;
    @FXML
    private Label searchIcon;
    @FXML
    private TableView table;
    @FXML
    private Button newButton;
    @FXML
    private Button editButton;

    private ObservableList<User> list;

    UserService userService = new UserService();

    // 初始化方法
    @Override
    public void initialize(URL location, ResourceBundle resources) {
     componentInit();               // 组件初始化
     addListener();                 // 添加监听事件
    }

    // 组件初始化
    private void componentInit(){

        // 给标签设置icon样式的图标
        Image image;
        image = new Image(getClass().getResourceAsStream("/icon/currentUser.png"), 32, 32, false, false);
        usernameicon.setGraphic(new ImageView(image));

        image = new Image(getClass().getResourceAsStream("/icon/backIcon.png"), 32, 32, false, false);
        goback.setGraphic(new ImageView(image));

        image = new Image(getClass().getResourceAsStream("/icon/searchalluserIcon.png"), 32, 32, false, false);
        searchIcon.setGraphic(new ImageView(image));

        // 新建表格列 并为其绑定用户属性 使其可以观察到用户属性的变化
        TableColumn nameCol = new TableColumn("用户名");
        nameCol.setCellValueFactory(new PropertyValueFactory<>("username"));
        nameCol.setPrefWidth(100);
        TableColumn pwdCol = new TableColumn("密码");
        pwdCol.setCellValueFactory(new PropertyValueFactory<>("password"));
        pwdCol.setPrefWidth(100);
        TableColumn telCol = new TableColumn("联系方式");
        telCol.setCellValueFactory(new PropertyValueFactory<>("tel"));
        telCol.setPrefWidth(100);
        TableColumn addCol = new TableColumn("地址");
        addCol.setCellValueFactory(new PropertyValueFactory<>("addr"));
        addCol.setPrefWidth(150);
        TableColumn auCol = new TableColumn("权限");
        auCol.setCellValueFactory(new PropertyValueFactory<>("state"));
        auCol.setPrefWidth(50);

        // 给表格添加列
        table.getColumns().addAll(nameCol, pwdCol, telCol, addCol, auCol);
        // 查询用户信息 并填充表格
        searchAllUser();
    }


    // 添加监听器
    private void addListener(){
        // 鼠标进入组件时 改变鼠标的样式
        WindowUtils.changeMouse(goback);
        WindowUtils.changeMouse(searchIcon);
        WindowUtils.changeMouse(newButton);
        WindowUtils.changeMouse(editButton);
        // 执行耗时操作时改变鼠标的样式
        WindowUtils.MouseWait(searchIcon);
        // 表格添加鼠标监听 双击表格可进入编辑界面
        table.addEventHandler(MouseEvent.MOUSE_CLICKED, e->{
            if(e.getButton() == MouseButton.PRIMARY){
                if(e.getClickCount() >= 2){
                    try {
                        edit();
                    } catch (IOException ex) {
                        ex.printStackTrace();
                    }
                }
            }
        });
    }

    // 调用服务层查询用户的方法 并填充表格
    private void searchAllUser(){
        list = FXCollections.observableArrayList(userService.searchAllUser());
        table.setItems(list);
    }

    // 返回管理员主界面
    @FXML
    private void back() throws IOException {
        WindowUtils.showFrame("/com/jwinf/cdLibary/view/AdminMainFrame.fxml", "/icon/loginIcon.png", "管理员主界面");
        WindowUtils.destroyStage(goback);         // 销毁当前窗体
    }

    // 在表格中定位指定的用户 滑动到用户所在位置 并选中该用户
    @FXML
    private void search(){
        String username = usernametxt.getText();
        if (username == null || username.isEmpty()){
            WindowUtils.showTip("请输入用户名", "/icon/warnIcon.png", "-fx-background-color:  linear-gradient(to top, #93a5cf 0%, #e4efe9 100%);");
            return;
        }
        // 获得一个迭代器 加快遍历表格的速度
        Iterator<User> iterator = list.iterator();
        User user;
        int count = 0;
        while (iterator.hasNext()){
           user = iterator.next();
           if (username.equals(user.getUsername())){
               break;
           }
            count += 1;
        }
        if(count == list.size()){
            WindowUtils.showTip("该用户不存在", "/icon/warnIcon.png", "-fx-background-color:  linear-gradient(to top, #93a5cf 0%, #e4efe9 100%);");
            return;
        }
        table.scrollTo(count);                     // 滑动到用户所在行
        table.getSelectionModel().select(count);   // 选中该行
    }

    // 添加用户方法
    @FXML
    private void add() throws IOException {
        // 弹出添加窗体
        WindowUtils.showaddFrame("/com/jwinf/cdLibary/view/AddUserFrame.fxml", "/icon/loginIcon.png", "注册");
        WindowUtils.destroyStage(newButton);               // 销毁当前窗体
    }

    // 编辑用户方法
    @FXML
    private void edit() throws IOException {
        // 获取选中的行
        int index = table.getSelectionModel().getSelectedIndex();
        // 提示用户
        if(index < 0){
            WindowUtils.showTip("请选择需要编辑的用户", "/icon/warnIcon.png", "-fx-background-color:  linear-gradient(to top, #93a5cf 0%, #e4efe9 100%);");
            return;
        }
        // 获取选中的对象
        User user = list.get(index);
        // 弹出编辑用户窗体
        WindowUtils.showeditFrame(user);
        // 销毁当前窗体
        WindowUtils.destroyStage(editButton);
    }

    // 删除用户方法
    @FXML
    private void delete(){
        // 获取选中的行
        int index = table.getSelectionModel().getSelectedIndex();
        // 判断数据合法性 并提示用户
        if (index < 0){
            WindowUtils.showTip("请选择删除对象", "/icon/warnIcon.png", "-fx-background-color:  linear-gradient(to top, #93a5cf 0%, #e4efe9 100%);");
            return;
        }
        // 获取选中的对象
        User user = list.get(index);
        // 判断用户的选择
        if(ButtonType.OK == WindowUtils.inquiryAlert("是否删除该用户", "-fx-background-color:  linear-gradient(to top, #93a5cf 0%, #e4efe9 100%);").get()){
            // 调用服务层的删除方法 并提示用户
            if(userService.delete(user)){
                WindowUtils.showTip("删除成功", "/icon/SuccessIcon.png", "-fx-background-color:  linear-gradient(to top, #93a5cf 0%, #e4efe9 100%);");
                // 刷新表格
                searchAllUser();
            }
        }

    }
}
